/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.mediador.gui;

import br.com.cpqd.ssar.mediador.ControladorDiretorios;
import br.com.cpqd.ssar.mediador.ControladorMateriais;
import br.com.cpqd.ssar.mediador.ControladorServicos;
import br.com.cpqd.ssar.mediador.ControladorFonteEletromagnetica;
import br.com.cpqd.ssar.utilitarias.Geometria;
import br.com.cpqd.ssar.utilitarias.Material;
import java.awt.Frame;
import java.io.File;
import java.io.IOException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;

/**
 * Classe que Controla a Exibição de Janelas do Software
 * @author Rafael Buck
 * @version 1.4
 */
public class ControladorJanelas {

    /**
     * Janela Principal do Aplicativo
     */
    private JanelaPrincipal janelaPrincipal;
    /**
     * Referencia ao Controlador de Diretorios
     */
    private ControladorDiretorios controladorDiretorios;
    /**
     * Referencia ao Controlador de Materiais
     */
    private ControladorMateriais controladorMateriais;
    /**
     * Referência ao Controlador de Servicos
     */
    private ControladorFonteEletromagnetica controladorFonteEletromagnetica;
     /**
     * Referência ao Controlador de Fonte eletromagnetica
     */

    private ControladorServicos controladorServicos;
    /**
     * Janela Central
     */
    private JPanel janelaCentral;
    /**
     * Material Selecionado pelo Usuário
     */
    private Material materialSelecionado;

    /**
     * Indica se o projeto foi crado
     */
    private boolean projetoCriado = false;

    public ControladorJanelas() {
        // Seleciona Look and Feel do Sistema Operacional Vigente
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

            UIManager.put("FileChooser.lookInLabelMnemonic", "E");
            UIManager.put("FileChooser.lookInLabelText", "Examinar em");

            UIManager.put("FileChooser.saveInLabelMnemonic", "S");
            UIManager.put("FileChooser.saveInLabelText", "Salvar em");

            UIManager.put("FileChooser.upFolderToolTipText", "Um nível acima");
            UIManager.put("FileChooser.upFolderAccessibleName", "Um nível acima");

            UIManager.put("FileChooser.homeFolderToolTipText", "Desktop");
            UIManager.put("FileChooser.homeFolderAccessibleName", "Desktop");

            UIManager.put("FileChooser.newFolderToolTipText", "Criar nova pasta");
            UIManager.put("FileChooser.newFolderAccessibleName", "Criar nova pasta");

            UIManager.put("FileChooser.listViewButtonToolTipText", "Lista");
            UIManager.put("FileChooser.listViewButtonAccessibleName", "Lista");

            UIManager.put("FileChooser.detailsViewButtonToolTipText", "Detalhes");
            UIManager.put("FileChooser.detailsViewButtonAccessibleName", "Detalhes");

            UIManager.put("FileChooser.fileNameLabelMnemonic", "N");
            UIManager.put("FileChooser.fileNameLabelText", "Nome do arquivo");

            UIManager.put("FileChooser.filesOfTypeLabelMnemonic", "A");
            UIManager.put("FileChooser.filesOfTypeLabelText", "Arquivos do tipo");

            UIManager.put("FileChooser.fileNameHeaderText", "Nome");
            UIManager.put("FileChooser.fileSizeHeaderText", "Tamanho");
            UIManager.put("FileChooser.fileTypeHeaderText", "Tipo");
            UIManager.put("FileChooser.fileDateHeaderText", "Data");
            UIManager.put("FileChooser.fileAttrHeaderText", "Atributos");

            UIManager.put("FileChooser.cancelButtonText", "Cancelar");
            UIManager.put("FileChooser.cancelButtonMnemonic", "C");
            UIManager.put("FileChooser.cancelButtonToolTipText", "Cancelar");

            UIManager.put("FileChooser.openButtonText", "Abrir");
            UIManager.put("FileChooser.openButtonMnemonic", "A");
            UIManager.put("FileChooser.openButtonToolTipText", "Abrir");

            UIManager.put("FileChooser.saveButtonText", "Salvar");
            UIManager.put("FileChooser.saveButtonToolTipText", "S");
            UIManager.put("FileChooser.saveButtonToolTipText", "Salvar");

            UIManager.put("FileChooser.updateButtonText", "Alterar");
            UIManager.put("FileChooser.updateButtonToolTipText", "A");
            UIManager.put("FileChooser.updateButtonToolTipText", "Alterar");

            UIManager.put("FileChooser.helpButtonText", "Ajuda");
            UIManager.put("FileChooser.helpButtonToolTipText", "A");
            UIManager.put("FileChooser.helpButtonToolTipText", "Ajuda");

            // Quando clica na Pasta volta a aparecer "Open"
            UIManager.put("FileChooser.directoryOpenButtonText", "Abrir");
            UIManager.put("FileChooser.directoryOpenButtonToolTipText", "Abrir diretório selecionado");

        } catch (Exception e) {
            e.printStackTrace();
        }
        // Cria Janela Principal
        janelaPrincipal = new JanelaPrincipal(this);
        // Seta ela como Visível
        janelaPrincipal.setVisible(true);
        // Começa Maximizada
        janelaPrincipal.setExtendedState(JFrame.MAXIMIZED_BOTH);

        // Opção de Projeto
        JanelaOpcoesIniciais janelaProjeto = new JanelaOpcoesIniciais(this, new Frame(), true);
        // Centraliza
        janelaProjeto.setLocationRelativeTo(null);
        // Seta como visível
        janelaProjeto.setVisible(true);
    }

    /**
     * Seta o Painel Central
     * @param painel JPanel
     */
    public void setJPanel(JPanel painel) {
        janelaCentral = painel;
    }

    /**
     * Retorna a Instância da Janela Principal
     * @return JanelaPrincipal
     */
    public JanelaPrincipal getJanelaPrincipal() {
        return janelaPrincipal;
    }

    /**
     * Seta Janela Principal
     * @param janelaPrincipal JanelaPrincipal
     */
    public void setJanelaPrincipal(JanelaPrincipal janelaPrincipal) {
        this.janelaPrincipal = janelaPrincipal;
    }

    /**
     * Set the value of controladorDiretorios
     * @param controladorDiretorios new value of controladorDiretorios
     */
    public void setControladorDiretorios(ControladorDiretorios controladorDiretorios) {
        this.controladorDiretorios = controladorDiretorios;
    }

    /**
     * Set the value of controladorMateriais
     * @param controladorMateriais new value of controladorMateriais
     */
    public void setControladorMateriais(ControladorMateriais controladorMateriais) {
        this.controladorMateriais = controladorMateriais;
    }

    /**
     * Solicita a Abertura de um Novo Projeto
     * @param caminho String
     * @param nome String
     * @param unidade String
     */
    public void novoProjeto(String caminho, String nome, String unidade) throws IOException {
        controladorDiretorios.setCaminhoProjeto(caminho);
        controladorDiretorios.setNomeProjeto(nome);
        controladorDiretorios.setUnidadeDimensional(unidade);
        controladorDiretorios.gerarPastaProjeto();
        controladorServicos.salvarProjeto();
        janelaPrincipal.setTitle("Software SEM-BR - v1.2 Projeto: " + " - " + nome);
        janelaPrincipal.acionaBotoesAposAberturaProjeto();
        janelaPrincipal.setJPanelCentral(janelaCentral);
        this.projetoCriado = true;
    }

    /**
     * Solicita a Abertura de um Projeto Existente
     * @param caminhoCompleto String
     */
    public void novoProjeto(String caminhoCompleto) {
        //Projeto já existe
        controladorDiretorios.abrirPastaProjeto(caminhoCompleto);
        controladorServicos.carregarProjeto();
        janelaPrincipal.setTitle("Software SEM-BR - v1.2 Projeto: " + " - " + controladorDiretorios.getNomeProjeto());
        janelaPrincipal.acionaBotoesAposAberturaProjeto();
        janelaPrincipal.setJPanelCentral(janelaCentral);
        this.projetoCriado = true;
    }

    /**
     * Cria novo projeto
     */
    public void criarNovoProjeto() {
        if (this.isProjetoCriado()) {
            int opcao = controladorServicos.exibirMensagemEscolhaSimNaoCancelar("Deseja Salvar Projeto?");
            if (opcao == 0) {
                controladorServicos.salvarProjeto();
                controladorServicos.exibirMensagemInformacao("Projeto Salvo com Sucesso");
                controladorServicos.reinicializarSistema();
                JanelaCriarNovoProjeto janelaNovoProjeto = new JanelaCriarNovoProjeto(this, new Frame(), true);
                // Centraliza
                janelaNovoProjeto.setLocationRelativeTo(null);
                // visivel
                janelaNovoProjeto.setVisible(true);
            } else if (opcao == 1) {
                controladorServicos.reinicializarSistema();
                JanelaCriarNovoProjeto janelaNovoProjeto = new JanelaCriarNovoProjeto(this, new Frame(), true);
                // Centraliza
                janelaNovoProjeto.setLocationRelativeTo(null);
                // visivel
                janelaNovoProjeto.setVisible(true);
            }
        } else {
            JanelaCriarNovoProjeto janelaNovoProjeto = new JanelaCriarNovoProjeto(this, new Frame(), true);
            // Centraliza
            janelaNovoProjeto.setLocationRelativeTo(null);
            // visivel
            janelaNovoProjeto.setVisible(true);
        }
    }

    /**
     * 
     */
    public void abrirNovoProjeto() {
        if (this.isProjetoCriado()) {
            int opcao = controladorServicos.exibirMensagemEscolhaSimNaoCancelar("Deseja Salvar Projeto?");
            if (opcao == 0) {
                controladorServicos.salvarProjeto();
                controladorServicos.exibirMensagemInformacao("Projeto Salvo com Sucesso");
                controladorServicos.reinicializarSistema();
                // Procura um Caminho no Computador
                JFileChooser jFileChooser = new JFileChooser(System.getProperty("user.dir") + File.separator + "MeusProjetos");
                // Habilita para Obter apenas Diretorios
                jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                // Seta Filtro
                jFileChooser.setFileFilter(this.obterFiltroProjetoSSAR());
                // Muda o título da Janela do File Chooser
                jFileChooser.setDialogTitle("Localizar Projeto");
                // Lê a Opção do Usuário
                int option = jFileChooser.showOpenDialog(new JFrame());
                // Teste de Seleção do Usuário
                if (option == JFileChooser.APPROVE_OPTION) {
                    String caminhoProjeto = jFileChooser.getSelectedFile().toString();
                    this.novoProjeto(caminhoProjeto);
                } else if (option == JFileChooser.CANCEL_OPTION) {
                }
            } else if (opcao == 1) {
                controladorServicos.reinicializarSistema();
                // Procura um Caminho no Computador
                JFileChooser jFileChooser = new JFileChooser(System.getProperty("user.dir") + File.separator + "MeusProjetos");
                // Habilita para Obter apenas Diretorios
                jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                // Seta Filtro
                jFileChooser.setFileFilter(this.obterFiltroProjetoSSAR());
                // Muda o título da Janela do File Chooser
                jFileChooser.setDialogTitle("Localizar Projeto");
                // Lê a Opção do Usuário
                int option = jFileChooser.showOpenDialog(new JFrame());
                // Teste de Seleção do Usuário
                if (option == JFileChooser.APPROVE_OPTION) {
                    String caminhoProjeto = jFileChooser.getSelectedFile().toString();
                    this.novoProjeto(caminhoProjeto);
                } else if (option == JFileChooser.CANCEL_OPTION) {
                }
            }
        } else {
            // Procura um Caminho no Computador
            JFileChooser jFileChooser = new JFileChooser(System.getProperty("user.dir") + File.separator + "MeusProjetos");
            // Habilita para Obter apenas Diretorios
            jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            // Seta Filtro
            jFileChooser.setFileFilter(this.obterFiltroProjetoSSAR());
            // Muda o título da Janela do File Chooser
            jFileChooser.setDialogTitle("Localizar Projeto");
            // Lê a Opção do Usuário
            int option = jFileChooser.showOpenDialog(new JFrame());
            // Teste de Seleção do Usuário
            if (option == JFileChooser.APPROVE_OPTION) {
                String caminhoProjeto = jFileChooser.getSelectedFile().toString();
                this.novoProjeto(caminhoProjeto);
            } else if (option == JFileChooser.CANCEL_OPTION) {
            }
        }
    }

    /**
     * Obtem modelo para o Combo Box, com a lista de materiais
     * @return DefaultComboBoxModel
     */
    public DefaultComboBoxModel obterDefaultComboBoxModel() {
        return controladorMateriais.getModelo();
    }

    /**
     * Obtem modelo para o Combo Box, com a lista de materiais
     * @return DefaultComboBoxModel
     */
    public DefaultComboBoxModel obterDefaultComboBoxModelEditavel() {
        return controladorMateriais.getModeloEditavel();
    }

    /**
     * Remove Material da lista
     * @param material Material
     */
    public void removerMaterial(Material material) {
        controladorMateriais.removerMaterial(material);
    }

    /**
     * Tenta Adicionar um Novo Material
     * @param material Material
     * @return boolean
     */
    public boolean adicionarMaterial(Material material) {
        if (controladorMateriais.materialExiste(material.getNome())) {
            return false;
        } else {
            controladorMateriais.adicionaMaterial(material);
            return true;
        }
    }

    /**
     * Salva Material no Arquivo materiais.dat do Usuário
     */
    public void salvarMaterial() {
        controladorMateriais.salvaDadosArquivo();
    }

    /**
     * Obtem Caminho para os Icones do Programa
     * @return String caminho para a pasta de icones
     */
    public String obterCaminhoIcones() {
        return System.getProperty("user.dir") + File.separator + "Icones" + File.separator + "aplicativo.jpg";
    }

    /**
     * Retorna o filtro do Arquivo de Projeto SSAR.
     * @return FileFilter
     */
    public FileFilter obterFiltroProjetoSSAR() {

        FileFilter filtro = null;
        // cria o filtro associado ao tipo de arquivo STL
        filtro = new FileFilter() {

            public boolean accept(File f) {
                String fileName = f.getName().toLowerCase();
                return (fileName.endsWith(".ssar") || f.isDirectory());
            }

            public String getDescription() {
                return "Projeto SoftwareSAR (*.ssar)";
            }
        };
        return filtro;
    }

    /**
     * Set the value of controladorServicos
     * @param controladorServicos new value of controladorServicos
     */
    public void setControladorServicos(ControladorServicos controladorServicos) {
        this.controladorServicos = controladorServicos;
    }

    /**
     * Exemplo de Importação de Geometria
     */
    public void importarSTL() {
        Geometria geometria = controladorServicos.importarSTL();
    }

    /**
     * Get the value of materialSelecionado
     * @return the value of materialSelecionado
     */
    public Material getMaterialSelecionado() {
        this.abrirJanelaAtribuirMaterial();
        return materialSelecionado;
    }

    /**
     * Set the value of materialSelecionado
     * @param materialSelecionado new value of materialSelecionado
     */
    public void setMaterialSelecionado(Material materialSelecionado) {
        this.materialSelecionado = materialSelecionado;
    }

    /**
     * Abre Janela AtribuirMaterial
     */
    public void abrirJanelaAtribuirMaterial() {
        JanelaAtribuirMaterial janelaMaterial = new JanelaAtribuirMaterial(this, new javax.swing.JFrame(), true);
        janelaMaterial.setVisible(true);
    }

    /**
     * Abre Janela EditarMaterial
     */
    public void abrirJanelaEditarMaterial() {
        JanelaEditarMaterial janelaEditarMaterial = new JanelaEditarMaterial(this, new javax.swing.JFrame(), true);
        janelaEditarMaterial.setVisible(true);
    }

  public void abrirJanelaSobre() {
       JanelaCriarSobre janelaSobre = new JanelaCriarSobre(this, new javax.swing.JFrame(), true);
       //System.out.println("XXXXXXXXXXXXXXXXXXXX - Daniela");
        janelaSobre.setVisible(true);
    }

  public void abrirJanelaAjuda() {
       JanelaCriarAjuda janelaAjuda = new JanelaCriarAjuda(this, new javax.swing.JFrame(), true);
      // System.out.println("XXX");
        janelaAjuda.setVisible(true);
    }
    /**
     * Abre Janela CadastrarMaterial
     */
    public void abrirJanelaCadastrarMaterial() {
        JanelaCadastrarMaterial janelaCriarMaterial = new JanelaCadastrarMaterial(this, new javax.swing.JFrame(), true);
        janelaCriarMaterial.setVisible(true);
    }

   
    public void salvarProjeto() {
        controladorServicos.salvarProjeto();
    }

    /**
     * Obtém Referência direta para o controlador de Serviços
     * @return ControladorServicos
     */
    public ControladorServicos obterServicos() {
        return this.controladorServicos;
    }

    /*
     * Chamada para configuracao da PML da simulacao
     */
    public void configurarPML() {
        controladorServicos.configurarPML();
    }

    public boolean isProjetoCriado() {
        return projetoCriado;
    }

    public void setProjetoCriado(boolean projetoCriado) {
        this.projetoCriado = projetoCriado;
    }

    public void janelaRemoverFonteEletromagnetica() throws IOException{
        controladorFonteEletromagnetica = new ControladorFonteEletromagnetica();
        controladorFonteEletromagnetica.callJanelaRemoverFonteEletromagnetica();
    }

}
